package com.df;

import com.df.common.MapThread;
import com.df.common.MsgHandlerManger;
import com.df.common.Player;
import com.df.server.WebsocketServer;

import java.util.Collection;
import java.util.Scanner;
import java.util.concurrent.CountDownLatch;
//TODO 要定时同步服务器时间
//移动方案：
//1.移动轴/键盘方向键移动，默认玩家按下再抬起的低间隔（移动输入的最小间隔）为100ms，则按下后，到达接收输入的时间则计算移动目标点，
//即接收输入后默认会按照当前速度移动100ms，即使100ms内抬起了，也按100ms计算，如果是点击某一个点，则A*寻路计算移动点(这里的移动点是按地图分割格子来记录的)

//2.没有输入间隔，只要状态发生变化，则组装请求发送服务器，即若100ms内按下抬起3次就给服务器发送6次状态信息，3次开始移动，3次停止移动

//可以看出方案1的灵敏度较低，对100ms内的操作忽略，当然这个输入接收间隔设置的越小，灵敏度越高，但是流量消耗就越大，方案2在状态变化不频繁的情况下，网络压力最小，
//操作频繁了网络压力就大了
//方案1同步位置简单，服务器只需要按请求的路径点移动(延迟要就需要快速移动)就行，其他客户端也只需要按照路径点做插值表现就行，如果服务器中途停止移动，则只需要
//返回服务器的当前坐标，客户端如果坐标不是服务器坐标，则做差值会到服务器坐标
public class Main {
    public static void main(String[] args) {
        //TODO 扫描消息处理器
        MsgHandlerManger.getInstance().init();
        WebsocketServer server = new WebsocketServer();
        server.start();
        MapThread.getInstance().start();
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            server.stopServer();
            MapThread.getInstance().running = false;
        }));
        Scanner scanner = new Scanner(System.in);
        while (true){
            String next = scanner.next();
            if(next.equals("exit")){
                System.exit(-1);
                break;
            }
            if(next.equals("playerstatus")){
                Collection<Player> values = MapThread.getInstance().players.values();
                if(values.isEmpty()){
                    System.out.println("地图玩家数量为0");
                    continue;
                }
                for (Player value : values) {
                    System.out.println(value);
                }
                continue;
            }
        }
    }
}